#include<iostream>
#include<pthread.h>
#include<vector>
#include<unistd.h>
#include<cassert>
#include<cstdio>

using namespace std;
// pthread_exit接口实现线程终止

// 当成结构体来用
class ThreadDate
{
public:
    pthread_t _tid;
    char _namebuffer[64];
};


void* thread_routine(void* args)
{
    // 为了保证主线程for循环完毕之后，将所有新线程的信息先打印出来，让所有新线程都先等一会
    sleep(1); 

    // 把每个新线程的名字打印出来
    ThreadDate* td = static_cast<ThreadDate*>(args); // 安全的进行强制类型转换
    int cnt = 5;
    while(cnt)
    {
        // 将每个线程的名字利用传进来的结构体打印出来
        printf("new thread's name: %s, cnt: %d\n", td->_namebuffer, cnt--);
        sleep(1); 
        pthread_exit(nullptr); // 让线程终止
    }

    delete td;
    // return nullptr;  //当return nullptr的时候，这个线程就算终止了
}

int main()
{
    // 创建一批新线程
    vector<ThreadDate*> tds;
    for(int i = 1; i <= 10; i++)
    {
        ThreadDate* td = new ThreadDate(); 
        // 给每个新线程不一样的名字
        snprintf(td->_namebuffer, sizeof(td->_namebuffer), "%s %d", "thread", i);
        int n = pthread_create(&td->_tid, nullptr, thread_routine, td); //直接传td进去, 结构体不会被共享
        // assert(n == 0);
        // (void)n;
        tds.push_back(td);
    }

    // 将所有新线程都创建完毕之后，输出所有新线程的信息
    for(auto& td : tds)
    {
        cout << "create thread：" << td->_namebuffer << " : " << "tid：" << td->_tid << endl;
    }

    while(1)
    {
        cout << "main thread，running" << endl;
        sleep(1);
    }

    return 0; 
}